/*
 * CLASS: Library.java
 */

package model;
import java.io.*;
import java.util.ArrayList;

/**
 *
 * @author Samuele Mattiuzzo
 */
public class Library {
    private ArrayList<Product> prodotti = new ArrayList<Product>();
    private ArrayList<Author> autori = new ArrayList<Author>();
    private ArrayList<User> persone = new ArrayList<User>();
    private static final Library singleton = new Library();

    /**
     * Costruttore privato per la classe library
     */
    private Library(){
        loadLibrary();
    }

    /**
     * Metodo per ottenere il riferimento all'istanza privata della libreria
     * @return singleton libreria
     */
    public static Library getSingleton(){
        return singleton;
    }

    /**
     * Controlla se esiste un utente
     * @param search username dell'utente
     * @return true false se trova o meno l'utente
     */
    public boolean userExists(String search){
        for(User p:persone)
            if (p.getUser(search))
                return true;
        return false;
    }

    /**
     * Ritorna un utente
     * @param search username dell'utente
     * @return p utente trovato
     */
    public User getUser(String search){
        for (User p:persone)
            if (p.getUser(search))
                return p;
        return null;
    }

    /**
     * Ottiene tutti gli autori dalla libreria
     * @return autori lista degli autori
     */
    public ArrayList<Author> getAuthors(){
        return autori;
    }

    /**
     * Ottiene tutti i prodotti in libreria
     * @return prodotti lista dei prodotti
     */
    public ArrayList<Product> getProducts(){
        return prodotti;
    }

    /**
     * Tutti gli utenti della libreria
     * @return persone lista degli utenti
     */
    public ArrayList<User> getUsers(){
        return persone;
    }

    /**
     * Salva i dati correnti
     * @return true se e' andato a buon fine
     */
    public void dumpLibrary(){
        try {
            ObjectOutput out = new ObjectOutputStream(new FileOutputStream("libreria.dat"));

            if(!prodotti.isEmpty())
                for(Product p:prodotti){
                    out.writeObject(p);
                }

            for(User u:persone){
                out.writeObject(u);
            }

            if(!autori.isEmpty())
                for(Author a:autori){
                    out.writeObject(a);
                }

            out.flush();
            out.close();
        } catch (IOException e) {
            System.err.println("Impossibile scrivere su file: "+e);
        }
    }

    /**
     * Carica i dati dell'ultima sessione
     * @return true se andato a buon fine
     */
    public void loadLibrary(){
        ObjectInput inStream = null;
        File file = new File("libreria.dat");

        // Eventuale creazione e apertura file
        try {
            if (!file.exists()){
                file.createNewFile();
                try {
                    ObjectOutput out = new ObjectOutputStream(new FileOutputStream("libreria.dat"));
                    out.writeObject(new User(0,"admin","admin"));
                    out.flush();
                    out.close();
                }catch (IOException e) {
                    System.err.println(e);
                }
            }
        } catch (IOException e) {
            System.err.println("Errore creazione file");
        }

        FileInputStream in = null;

        try {
            in = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            System.err.println("FileInputStream: file non trovato");
        } catch (IOException e) {
            System.err.println("FileInputStream: apertura file");
        }

        try {
            inStream = new ObjectInputStream(in);
        } catch (NullPointerException e) {
            System.err.println("ObjectInputStream: Null Pointer.");
        } catch (FileNotFoundException e) {
            System.err.println("ObjectInputStream: file non trovato.");
        } catch (StreamCorruptedException e) {
            System.err.println("ObjectInputStream: stream corrotto.");
        } catch (IOException e) {
            System.err.println("ObjectInputStream: apertura file.");
        }

        Object tmp;
        try {
            int i=0;
            while ((tmp = inStream.readObject()) != null) {
                i++;
                if (tmp instanceof Author)
                    autori.add((Author) tmp);
                else if (tmp instanceof Product)
                    prodotti.add((Product) tmp);
                else if (tmp instanceof User)
                    persone.add((User) tmp);
            }
        }catch (IOException e) {
            System.out.println("ReadObject: IOexception ("+e+")");
        }catch (ClassNotFoundException e) {
            System.out.println("ReadObject: class error ("+e+")");
        }
    }

    
}
